home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 051 < prev    next >
Internet Message Format  |  1997-05-06  |  69KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-051
  3. Date: Fri, 12 Aug 1994 16:04:14 +0200 (MET DST)
  4.  
  5. C.S.M.P. Digest             Fri, 12 Aug 94       Volume 3 : Issue 51
  6.  
  7. Today's Topics:
  8.  
  9.         Controls, Fonts, Dialogs & ResEdit (long)
  10.         Deleting ptr to base not calling dtors of derived
  11.         Icon positions on desktop
  12.         Looking for source code
  13.         Need C source code for recording sound
  14.         OpenPicture with temporary memory?
  15.         QuickTime 2.0 and MIDI
  16.         Tab Patch for TextEdit
  17.         [Q] Increasing stack size?
  18.  
  19.  
  20.  
  21. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  22. (pottier@clipper.ens.fr).
  23.  
  24. The digest is a collection of article threads from the internet newsgroup
  25. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  26. regularly and want an archive of the discussions.  If you don't know what a
  27. newsgroup is, you probably don't have access to it.  Ask your systems
  28. administrator(s) for details.  If you don't have access to news, you may
  29. still be able to post messages to the group by using a mail server like
  30. anon.penet.fi (mail help@anon.penet.fi for more information).
  31.  
  32. Each issue of the digest contains one or more sets of articles (called
  33. threads), with each set corresponding to a 'discussion' of a particular
  34. subject.  The articles are not edited; all articles included in this digest
  35. are in their original posted form (as received by our news server at
  36. nef.ens.fr).  Article threads are not added to the digest until the last
  37. article added to the thread is at least two weeks old (this is to ensure that
  38. the thread is dead before adding it to the digest).  Article threads that
  39. consist of only one message are generally not included in the digest.
  40.  
  41. The digest is officially distributed by two means, by email and ftp.
  42.  
  43. If you want to receive the digest by mail, send email to listserv@ens.fr
  44. with no subject and one of the following commands as body:
  45.     help                        Sends you a summary of commands
  46.     subscribe csmp-digest Your Name    Adds you to the mailing list
  47.     signoff csmp-digest            Removes you from the list
  48. Once you have subscribed, you will automatically receive each new
  49. issue as it is created.
  50.  
  51. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  52. Questions related to the ftp site should be directed to
  53. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  54. digest are available there.
  55.  
  56. Also, the digests are available to WAIS users.  To search back issues
  57. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  58. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  59.  
  60.  
  61. -------------------------------------------------------
  62.  
  63. >From jcr@mbunix.mitre.org (Rogers)
  64. Subject: Controls, Fonts, Dialogs & ResEdit (long)
  65. Date: 28 Jul 1994 19:31:23 GMT
  66. Organization: The MITRE Corporation, Bedford, MA
  67.  
  68. There's been a bit of traffic lately all having to do with fonts
  69. of dialog items, and I just happen to have been concerned with that
  70. myself lately, and also with controls, so I decided to try to put
  71. together a concise guide to these overlapping topics. It follows.
  72. Everyone feel free to add to it. Or send comments to me and I'll
  73. incorporate.
  74.  
  75. =====================================================================
  76. Creating Controls with ResEdit 2.1.1                     28 July 1994
  77. =====================================================================
  78.  
  79. Here is a guide to creating controls using ResEdit 2.1.1.
  80.  
  81. Please distribute freely, and add to any appropriate FAQs.
  82.  
  83. Please send any comments regarding errors, omissions, etc., to:
  84.  
  85.      Jeff Rogers
  86.      jrogers@mitre.org
  87. _____________________________________________________________________
  88.  
  89. When editing a control in ResEdit, you see a template much like
  90. the ASCII depiction below.
  91.  
  92.  
  93. +-------------------------------------------------------------------+
  94. |=|_|============== CNTL ID = 128 from App_pi.rsrc =================|
  95. |-----------------------------------------------------------------+-|
  96. |                                                                 |^|
  97. |               +-----+ +-----+ +-----+ +-----+    ,-----.        | |
  98. |  BoundsRect   | 391 | | 502 | | 411 | | 652 |   (  Set  )       | |
  99. |               +-----+ +-----+ +-----+ +-----+    '-----'        | |
  100. |               +-----------+                                     | |
  101. |  Value        | 0         |                                     | |
  102. |               +-----------+                                     | |
  103. |                ,-.            ,-.                               | |
  104. |  Visible      ( 0 ) True     (   ) False                        | |
  105. |                '-'            '-'                               | |
  106. |               +-----------+                                     | |
  107. |  Max          | 1         |                                     | |
  108. |               +-----------+                                     | |
  109. |               +-----------+                                     | |
  110. |  Min          | 0         |                                     | |
  111. |               +-----------+                                     | |
  112. |               +-----------+                                     | |
  113. |  ProcID       | 8         |                                     | |
  114. |               +-----------+                                     | |
  115. |               +----------------+                                | |
  116. |  RefCon       | 0              |                                | |
  117. |               +----------------+                                | |
  118. |               +------------------------------------+            | |
  119. |  Title        | Generate Schedule...               |            | |
  120. |               +------------------------------------+            | |
  121. |                                                                 |v|
  122. |_________________________________________________________________|_|
  123.  
  124.  
  125. The proper values for the various fields are not always obvious.
  126. Below is a guide to assigning the correct values.
  127.  
  128. BoundsRect
  129. - --------
  130. This is the control's rectangle in local coordinates. The bounds
  131. are shown in the following order: top, left, bottom, right.
  132.  
  133. Value
  134. - ---
  135. This is the initial value of the control. It should be given one of
  136. the following values, based on the type of control you wish to create:
  137.  
  138.    PushButton  : 0
  139.  
  140.    CheckBox    : 0 = not checked
  141.                  1 = checked
  142.  
  143.    RadioButton : 0 = not selected
  144.                  1 = selected
  145.  
  146.    ScrollBar   : anything between Max and Min, inclusive
  147.  
  148.    PopUpMenu   : The Value parameter of a pop-up menu is used when
  149.                  creating the menu to indicate how the pop-up's
  150.                  title is to be drawn. It should be any ORed
  151.                  combination (sum) of the following:
  152.  
  153.                       0 - left-justified
  154.                       1 - center-justified
  155.                     255 - right-justified
  156.                     256 - bold             4096 - shadow
  157.                     512 - italic           8192 - condensed
  158.                    1024 - underlined      16384 - extended
  159.                    2048 - outlined        32768 - plain
  160.  
  161.                  After the pop-up menu is created, this field
  162.                  will contain the value 1.
  163.  
  164. Visible
  165. - -----
  166. This indicates whether the control is initially visible.
  167.  
  168. Max
  169. - -
  170. This is the maximum value the control may assume. It should
  171. be given one of the following values:
  172.  
  173.    PushButton  : 1
  174.    CheckButton : 1
  175.    RadioButton : 1
  176.    ScrollBar   : any value appropriate to the application
  177.    PopUpMenu   : width in pixels of pop-up menu's title
  178.                  (After the pop-up menu is created, this field
  179.                   will contain the # of items in the pop-up menu.)
  180.  
  181. Min
  182. - -
  183. This is the minimum value the control may assume. It should
  184. be given one of the following values:
  185.  
  186.    PushButton  : 0
  187.    CheckButton : 0
  188.    RadioButton : 0
  189.    ScrollBar   : any value appropriate to the application
  190.    PopUpMenu   : resource ID of menu to pop up
  191.                  (After the pop-up menu is created,
  192.                   this field will contain the value 1.)
  193.  
  194. ProcID
  195. - ----
  196. This indicates which type of control to create, and also which
  197. font to use when drawing the control's title and other text. It
  198. should be given one of the following values:
  199.  
  200.    PushButton,  in system font :    0
  201.                 in window font :    8
  202.  
  203.    CheckButton, in system font :    1
  204.                 in window font :    9
  205.  
  206.    RadioButton, in system font :    2
  207.                 in window font :   10
  208.  
  209.    PopUpMenu ................. : 1008 *
  210.  
  211.    * PopUpMenu behavior can be affected by ORing (summing) the
  212.      ProcID with any of the following:
  213.         1 - don't dynamically adjust pop-up's width to accommodate
  214.             long menu items
  215.         8 - use the grafPort's font to draw the control's text
  216.         4 - ignore "min" field; instead, build a menu listing all
  217.             available resources of the type contained in "refCon"
  218.             field
  219.      Thus the following are valid ProcID values for a popUpMenu:
  220.         1008 - dynamic menu width - system font - menu from "Min"
  221.         1009 - fixed menu width   - system font - menu from "Min"
  222.         1012 - dynamic menu width - system font - list a resType
  223.         1013 - fixed menu width   - system font - list a resType
  224.         1016 - dynamic menu width - window font - menu from "Min"
  225.         1017 - fixed menu width   - window font - menu from "Min"
  226.         1020 - dynamic menu width - window font - list a resType
  227.         1021 - fixed menu width   - window font - list a resType
  228.  
  229. RefCon
  230. - ----
  231. This 32-bit value can be used by your app in any way you wish.
  232.  
  233. For popUpMenus, this field may (depending on the value of "ProcID"
  234. above) be used during creation of the popUpMenu and contain a
  235. 4-character resource type.
  236.  
  237. Title
  238. - ---
  239. This is the control's title. This text shows up inside a pushButton,
  240. or beside a checkBox, radioButton or popUpMenu. For scrollBars it
  241. remains invisible, but still can be used, e.g., to search a window's
  242. controls by title.
  243.  
  244.  
  245. ============================
  246. Dialogs, Controls, and Fonts
  247. ============================
  248.  
  249. A question that often arises is how to get pushButtons, checkBoxes,
  250. radioButtons, and/or popUpMenus in a dialog to be drawn with a font
  251. other than the system font. There are several ways to do this, one
  252. of which is the following:
  253.  
  254. In the DITL editor, rather than creating each control as the type of
  255. control you ultimately want it to be, instead create it as a generic
  256. control. Then, in the CNTL editor, you can specify the ProcID that
  257. will cause the control to be drawn in the dialog's font instead of
  258. the system font. (Thanks to Jens Alfke [jens_alfke@powertalk.apple.com]
  259. for this one.) Otherwise, the dialog manager creates the controls
  260. for you, and it will use ProcID values specifying use of the system
  261. font when drawing the controls. Once these controls are created, there
  262. seems to be no way to change this aspect of them; Apple has provided
  263. a "GetCVariant" call but no "SetCVariant" call.
  264.  
  265. To change the font of statText and editText items, you must take
  266. a different approach. Once the dialog has been created, call a
  267. routine like the following:
  268.  
  269. /**********************************************************************
  270. *
  271. *  FUNCTION:    SetDialogFontAndSize( DialogPtr theDialog,
  272. *                                     short     fontNum,
  273. *                                     short     fontSize    )
  274. *
  275. *  DESCRIPTION: This function sets the font and size to be used
  276. *               subsequently by static-text and edit-text items
  277. *               of a dialog.
  278. *
  279. *  WRITTEN BY:  jarezina@magnus.acs.ohio-state.edu
  280. *               (Jasna M. Arezina-Wilson)
  281. *
  282. *  MODIFIED BY: Jeffrey C. Rogers
  283. *               (jrogers@mitre.org)
  284. *
  285. ****************/
  286.  
  287. void SetDialogFontAndSize( DialogPtr theDialog,
  288.                            short     fontNum,
  289.                            short     fontSize   )
  290. {
  291.   FontInfo   f ;
  292.   GrafPtr    savedPort ;
  293.   
  294.   // Store the current grafPort, then change to the dialog.
  295.   
  296.   GetPort( &savedPort );
  297.   SetPort( theDialog );
  298.   
  299.   // Set up the dialog's grafPort font info.
  300.   
  301.   TextFont( fontNum );
  302.   TextSize( fontSize );
  303.   
  304.   // Deal with the static & edit text items.
  305.   
  306.   GetFontInfo( &f );
  307.   (*((DialogPeek)theDialog)->textH)->txFont = fontNum ;
  308.   (*((DialogPeek)theDialog)->textH)->txSize = fontSize ;
  309.   (*((DialogPeek)theDialog)->textH)->lineHeight = f.ascent + f.descent +
  310.                                                              f.leading ;
  311.   (*((DialogPeek)theDialog)->textH)->fontAscent = f.ascent ;
  312.   
  313.   // Restore previous grafPort.
  314.   
  315.   SetPort( savedPort );
  316. }
  317. /*********************************************************************/
  318.  
  319.  
  320. ---------------------------
  321.  
  322. >From ant@kunikpok.icus.com (handle)
  323. Subject: Deleting ptr to base not calling dtors of derived
  324. Date: Wed, 27 Jul 94 04:41:07 CDT
  325. Organization: Kunikpok Kennels and Komputers (Pet Project)
  326.  
  327. I'm having a problem with destructors. It popped up in a fairly large
  328. hierarchy, and I've boiled it down to the simplest possible below. If
  329. I call a function which accepts a pointer to Base, but the pointer is
  330. of class Derived, when the function deletes the object, it doesn't
  331. call Derived's destructor. If I add a destructor to Base, then it
  332. calls Derived's destructor, then Base's destructor (as I would expect).
  333. This seems like inconsistent behaviour. Is this correct C++? I need to
  334. get it to correctly call Derived's destructor. I don't want to have to
  335. add a destructor to Base (it doesnt need one). If your response is
  336. "just add one anyway", I must point this out: If this is a bug, then
  337. let's find out all the ramifications, instead of just ignoring it.
  338.  
  339. I am using (how on earth did you guess??) Symantec C++ 7.0.3  :)
  340.  
  341. Thanx!
  342.  
  343. - --- test.cp -----
  344.  
  345. class Base { };                 // Empty base class
  346.  
  347. class Derived : public Base     // Derived class, has a constructor
  348. {                               // and destructor
  349. public:
  350.     Derived( void );
  351.     virtual ~Derived( void );
  352.     char* theP;
  353. };
  354.  
  355. Derived::Derived( void )
  356. {
  357.     theP = new char [20000];    // Allocate some space
  358. }
  359.  
  360. Derived::~Derived( void )
  361. {
  362.     if ( theP != 0 )
  363.         delete[] theP;          // Free if allocated
  364. }
  365.  
  366. void    DeleteDerived( Derived* obj )
  367. {
  368.     delete obj;                 // Delete obj
  369. }
  370.  
  371. void    DeleteBase( Base* obj )
  372. {
  373.     delete obj;                 // Delete obj
  374. }
  375.  
  376. main()
  377. {
  378.     Derived*    b1 = new Derived;
  379.     Derived*    b2 = new Derived;
  380.     
  381.     DeleteDerived( b1 );        // Correctly calls ~Derived().
  382.     DeleteBase( b2 );           // Calls *no* destructors
  383.     
  384.     return 0;
  385. }
  386.  
  387. - --- end of test.cp -----
  388.  
  389. - ------------------------------------------------------------------
  390. Chelly Green 'Ant'          <cgreen%podbox.uucp@cs.utexas.edu>
  391.  
  392. +++++++++++++++++++++++++++
  393.  
  394. >From neeri@iis.ee.ethz.ch (Matthias Neeracher)
  395. Date: 28 Jul 1994 15:53:09 GMT
  396. Organization: Integrated Systems Laboratory, ETH, Zurich
  397.  
  398. In article <9q94Pc2w165w@kunikpok.icus.com> ant@kunikpok.icus.com (handle) writes:
  399. > I'm having a problem with destructors. It popped up in a fairly large
  400. > hierarchy, and I've boiled it down to the simplest possible below. If
  401. > I call a function which accepts a pointer to Base, but the pointer is
  402. > of class Derived, when the function deletes the object, it doesn't
  403. > call Derived's destructor. If I add a destructor to Base, then it
  404. > calls Derived's destructor, then Base's destructor (as I would expect).
  405. > This seems like inconsistent behaviour. Is this correct C++?
  406.  
  407. Yes.
  408.  
  409. > I need to get it to correctly call Derived's destructor. I don't want to have
  410. > to add a destructor to Base (it doesnt need one).
  411.  
  412. Well, I'll start with the argument by authority:
  413.  
  414. To quote Bjarne Stroustrup, _The C++ Programming Language_, 2nd edition:
  415. # In general, it is wise to supply a virtual destructor in all classes that
  416. # act as a base class in the sense that objects of derived classes are
  417. # manipulated (and possibly deleted) through a pointer to the base. This is
  418. # almost always the case for classes with even a single virtual function.
  419.  
  420. If that doesn't convince you, think about it in technical terms: How is
  421. the compiler to know to call a destructor of the derived class on a
  422.  
  423. delete base;
  424.  
  425. statement, unless the base class provides a hint in the form of a virtual
  426. destructor.
  427.  
  428. >If your response is "just
  429. > add one anyway", I must point this out: If this is a bug, then let's find out
  430. > all the ramifications, instead of just ignoring it.
  431.  
  432. Your attitude is correct, but it's not a bug.
  433.  
  434. > I am using (how on earth did you guess??) Symantec C++ 7.0.3  :)
  435.  
  436. Awww, leave those poor Symantec compiler guys alone for a change and let them
  437. fix the bugs that *are* there (As the "*=" thread has shown, it is hard enough
  438. to convince them of those already. The Metrowerks guys, on the other hand,
  439. didn't explicitely admit that it was a bug, but promised to fix it :-).
  440.  
  441. Matthias
  442.  
  443. - ---
  444. Matthias Neeracher <neeri@iis.ee.ethz.ch> http://err.ethz.ch/members/neeri.html
  445.   "Paranotions, which designate constructs, may now contain metanotions and
  446.    ``hypernotions'' have been introduced in order to designate protonotions"
  447.                 -- A. van Wijngaarden et al., _ALGOL 68 Revised Report_
  448.  
  449. +++++++++++++++++++++++++++
  450.  
  451. >From nagle@netcom.com (John Nagle)
  452. Date: Fri, 29 Jul 1994 04:08:28 GMT
  453. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  454.  
  455. neeri@iis.ee.ethz.ch (Matthias Neeracher) writes:
  456. >In article <9q94Pc2w165w@kunikpok.icus.com> ant@kunikpok.icus.com (handle) writes:
  457. >> I'm having a problem with destructors. It popped up in a fairly large
  458. >> hierarchy, and I've boiled it down to the simplest possible below. If
  459. >> I call a function which accepts a pointer to Base, but the pointer is
  460. >> of class Derived, when the function deletes the object, it doesn't
  461. >> call Derived's destructor. If I add a destructor to Base, then it
  462. >> calls Derived's destructor, then Base's destructor (as I would expect).
  463. >> This seems like inconsistent behaviour. Is this correct C++?
  464.  
  465. >Yes.
  466.  
  467.      That's right, but the rationale for it working this way is wierd.
  468.  
  469.      The trouble comes from the C++ design decision that classes and
  470. structs are the same, plus the design decision that classes that don't
  471. use "C++ features" have compatible storage layout with C structs.
  472.  Logically, all destructors should be virtual, but that would force
  473. all classes to have the machinery for virtual functions, in case somebody
  474. later derived a class from that class.  This would break C data structure
  475. compatibility.
  476.  
  477.      It really should be an error to derive a class with a destructor
  478. from a class which does not have a virtual destructor.  If you want
  479. normal destructor semantics, you have to have virtual destructors all the way
  480. down to the base class.  This is easily checkable and should be
  481. checked, rather than being viewed as a rite of passage for C++ programmers.
  482.  
  483.                     John Nagle
  484.  
  485. +++++++++++++++++++++++++++
  486.  
  487. >From sokoloff@mv.mv.com (Jim Sokoloff)
  488. Date: Thu, 28 Jul 1994 20:04:24 GMT
  489. Organization: MV Communications, Inc.
  490.  
  491. In article <9q94Pc2w165w@kunikpok.icus.com>,
  492. handle <ant@kunikpok.icus.com> wrote:
  493. >I'm having a problem with destructors. It popped up in a fairly large
  494. >hierarchy, and I've boiled it down to the simplest possible below. If
  495. >I call a function which accepts a pointer to Base, but the pointer is
  496. >of class Derived, when the function deletes the object, it doesn't
  497. >call Derived's destructor. If I add a destructor to Base, then it
  498. >calls Derived's destructor, then Base's destructor (as I would expect).
  499. >This seems like inconsistent behaviour. Is this correct C++? I need to
  500. >get it to correctly call Derived's destructor. I don't want to have to
  501. >add a destructor to Base (it doesnt need one). If your response is
  502. >"just add one anyway", I must point this out: If this is a bug, then
  503. >let's find out all the ramifications, instead of just ignoring it.
  504. [Sample deleted]
  505. AS far as I know, this is correct C++. Base has no dtor, therefore, when 
  506. you delete a Base *, there is no dtor to call. Therefore, your compiler is
  507. doing the right thing. Add a virtual dtor to Base anyway. This will cause the
  508. correct thing to happen. (From your perspective, meaning Derived dtor is 
  509. called. From the C++ perspective, the correct thing is already happening, and
  510. you have a bug in your code...)
  511.  
  512. - -Jim
  513.  
  514.  
  515.  
  516. +++++++++++++++++++++++++++
  517.  
  518. >From s2361905@techst02.technion.ac.il (Ben Hekster)
  519. Date: Thu, 28 Jul 1994 19:37:44 GMT
  520. Organization: Technion, Israel Institute of Technology
  521.  
  522. Hi--
  523.  
  524. >If
  525. >I call a function which accepts a pointer to Base, but the pointer is
  526. >of class Derived, when the function deletes the object, it doesn't
  527. >call Derived's destructor. If I add a destructor to Base, then it
  528. >calls Derived's destructor, then Base's destructor (as I would expect).
  529. >[...] Is this correct C++?
  530.  
  531. Yes, this is correct C++.  If you expect to be able to call member
  532. functions that you override in derived classes, you must declare
  533. the member function `virtual' in the base type.  Note that this
  534. is true for any member function, not just destructors.  I.e., if you
  535. have
  536.  
  537.     class Base { void f(); };
  538.  
  539.     class Derived : public Base { virtual void f(); };
  540.  
  541. then any application of f() to a Base binds to Base::f().  If you
  542. want the binding to be dynamic, you must supply the `virtual'.
  543. By omitting it you are implying that either you do not expect this
  544. function to be overridden, or that you don't want/need overridden
  545. versions to be called.
  546.  
  547.     The questionable thing here is why the compiler doesn't
  548. warn about the redeclaration of f().  Possibly because of C
  549. compatibility reasons.  MPW cfront doesn't either, even with maximum
  550. warnings.
  551.  
  552.     In general, if your class has virtual members, it should
  553. have a virtual destructor, even if the destructor action itself is
  554. trivial.  The ARM warns about this, to avoid exactly the problem
  555. you are having now.
  556.  
  557. Ben
  558.  
  559.  
  560. +++++++++++++++++++++++++++
  561.  
  562. >From afcjlloyd@aol.com (AFC JLloyd)
  563. Date: 29 Jul 1994 02:11:07 -0400
  564. Organization: America Online, Inc. (1-800-827-6364)
  565.  
  566. In article <nagleCtoou4.Bxw@netcom.com>, nagle@netcom.com (John Nagle)
  567. writes:
  568.  
  569. >neeri@iis.ee.ethz.ch (Matthias Neeracher) writes:
  570. >>In article <9q94Pc2w165w@kunikpok.icus.com> ant@kunikpok.icus.com
  571. (handle) writes:
  572. >>> I'm having a problem with destructors. It popped up in a fairly large
  573. >>> hierarchy, and I've boiled it down to the simplest possible below. If
  574. >>> I call a function which accepts a pointer to Base, but the pointer is
  575. >>> of class Derived, when the function deletes the object, it doesn't
  576. >>> call Derived's destructor. If I add a destructor to Base, then it
  577. >>> calls Derived's destructor, then Base's destructor (as I would
  578. expect).
  579. >>> This seems like inconsistent behaviour. Is this correct C++?
  580. >
  581. >>Yes.
  582. >
  583. >     That's right, but the rationale for it working this way is wierd.
  584. >
  585. >     The trouble comes from the C++ design decision that classes and
  586. >structs are the same, plus the design decision that classes that don't
  587. >use "C++ features" have compatible storage layout with C structs.
  588. > Logically, all destructors should be virtual, but that would force
  589. >all classes to have the machinery for virtual functions, in case somebody
  590. >later derived a class from that class.  This would break C data structure
  591. >compatibility.
  592. >
  593. >     It really should be an error to derive a class with a destructor
  594. >from a class which does not have a virtual destructor.  If you want
  595. >normal destructor semantics, you have to have virtual destructors all the
  596. way
  597. >down to the base class.  This is easily checkable and should be
  598. >checked, rather than being viewed as a rite of passage for C++
  599. programmers.
  600.  
  601. I think it's a little more complicated than this.  I can think of lots of
  602. uses for classes that don't need any virtual functions, but need
  603. destructors (e.g. resource acquisition classes).  There is no point in
  604. making the destructor be virtual in such a case, and doing so generates a
  605. whole vtbl when none is needed, so the overhead cost is actually quite
  606. high (much more so than adding one entry to an already existing vtbl).
  607.  
  608. However, I agree with the idea that it should be an error to derive from
  609. classes that don't have virtual destructors.  Since the compiler doesn't
  610. enforce it (what a great optional warning!), the only thing you can do is
  611. add it to your list of coding guidelines.  Scott Meyer's is now writing a
  612. column for the C++ Report which continues the set of guidelines he
  613. established in his (truly excellent) book "Effective C++: 50 Specific Ways
  614. to Improve Your Programs and Designs".  His most recent column presents
  615. the guideline: "Avoid having concrete classes inherit from concrete
  616. classes".  Couple this with the guideline "Make destructors virtual in
  617. abstract base classes", and you're well covered.
  618.  
  619. By the way, if the guideline against deriving from concrete classes seems
  620. wrong to you, I highly recommend you read the article (July-August 94
  621. issue of C++ Report, should still be on the newstands).
  622.  
  623. Jim Lloyd
  624. afcjlloyd@aol.com
  625.  
  626.  
  627. ---------------------------
  628.  
  629. >From eajohnsn@blue.weeg.uiowa.edu (Eric Johnson)
  630. Subject: Icon positions on desktop
  631. Date: 25 Jul 1994 18:12:33 -0500
  632. Organization: University of Iowa, Iowa City, IA, USA
  633.  
  634. Hope this isn't too obvious, but I lack most reference sources.  I am 
  635. curious how programs like UnderWare know where on the screen the 
  636. different icons and folders are kept.  If I wanted to write a program 
  637. that would move the desktop icons around (or copy the screen and pretend 
  638. to move them), where do I find their positions?  Any tips or pointers to 
  639. the correct IM volume would be great.
  640.  
  641. Eric Johnson                eajohnsn@blue.weeg.uiowa.edu
  642. Program in Genetics
  643. University of Iowa
  644.  
  645.  
  646.  
  647. +++++++++++++++++++++++++++
  648.  
  649. >From zobkiw@datawatch.com (joe zobkiw)
  650. Date: Tue, 26 Jul 1994 15:19:14 GMT
  651. Organization: Datawatch Corporation
  652.  
  653. In article <311gt1$2g57@blue.weeg.uiowa.edu>, eajohnsn@blue.weeg.uiowa.edu
  654. (Eric Johnson) wrote:
  655.  
  656. > Hope this isn't too obvious, but I lack most reference sources.  I am 
  657. > curious how programs like UnderWare know where on the screen the 
  658. > different icons and folders are kept.  If I wanted to write a program 
  659. > that would move the desktop icons around (or copy the screen and pretend 
  660. > to move them), where do I find their positions?  Any tips or pointers to 
  661. > the correct IM volume would be great.
  662.  
  663. For each volume, recurse through the "Desktop folder" and perform an
  664. FSpGetFInfo on each file. The fdLocation gives you the location of the
  665. topLeft corner of the icon. For directories (if you use FSpGetDInfo) it is
  666. the frLocation field.
  667.  
  668. ___________________________________________________________
  669. _/_/_/_/   Joe Zobkiw                                   ,,,
  670.     _/     Senior Software Engineer                     - -
  671.   _/       Datawatch Corporation                         L
  672. _/_/_/_/   zobkiw@datawatch.com                          -
  673.  
  674. +++++++++++++++++++++++++++
  675.  
  676. >From dkj@apple.com (Dave Johnson)
  677. Date: Tue, 26 Jul 1994 17:54:41 GMT
  678. Organization: Apple Computer
  679.  
  680. In article <zobkiw-2607941019140001@zobkiw.datawatch.com>,
  681. zobkiw@datawatch.com (joe zobkiw) wrote:
  682.  
  683. > For each volume, recurse through the "Desktop folder" and perform an
  684. > FSpGetFInfo on each file. The fdLocation gives you the location of the
  685. > topLeft corner of the icon. For directories (if you use FSpGetDInfo) it is
  686. > the frLocation field.
  687.  
  688. Note also that with the scriptable Finder (7.5+, I think) you can get/set
  689. the locations of items via AppleScript or Apple Events real easy . . .
  690.  
  691. +++++++++++++++++++++++++++
  692.  
  693. >From macneils@aol.com (MacneilS)
  694. Date: 28 Jul 1994 20:44:03 -0400
  695. Organization: America Online, Inc. (1-800-827-6364)
  696.  
  697. In article <mouse-280794174850@ppp-83-19.bu.edu>, mouse@bu.edu (Matt Mick)
  698. writes:
  699.  
  700. >>>>>>
  701. Look at the NIM:Files.  It tells you how to get the h and v pos of the
  702. file.  I think, if I remember correctly, that is for the Icon!
  703. <<<<<<
  704.  
  705. You want to use HGetFInfo(). This will give you all of the information
  706. that the Finder itself uses for the posistion of icons.
  707.  
  708. Take Care,
  709. MacneilS@aol.com
  710.  
  711. +++++++++++++++++++++++++++
  712.  
  713. >From grobbins@apple.com (Grobbins)
  714. Date: 28 Jul 1994 21:06:31 -0700
  715. Organization: Skunkworks
  716.  
  717. In article <mouse-280794174850@ppp-83-19.bu.edu>,
  718. Matt Mick <mouse@bu.edu> wrote:
  719. >In article <311gt1$2g57@blue.weeg.uiowa.edu>, eajohnsn@blue.weeg.uiowa.edu
  720. >(Eric Johnson) wrote:
  721. >> Hope this isn't too obvious, but I lack most reference sources.  I am 
  722. >> curious how programs like UnderWare know where on the screen the 
  723. >> different icons and folders are kept.
  724. >
  725. >Look at the NIM:Files.  It tells you how to get the h and v pos of the
  726. >file.  I think, if I remember correctly, that is for the Icon!
  727.  
  728. The fdLocation field of a file's FInfo (returned by PBGetCatInfo and
  729. FSpGetFInfo, among other calls) may have the icon location.  But because
  730. the Finder ruthlessly caches its file information, the numbers on
  731. disk may not be accurate and cannot reliably be used to determine or
  732. set the icon position.
  733.  
  734. With the Scriptable Finder, you can use AppleScript to have the Finder
  735. get and set the positions of icons.  But any commercial products now
  736. that "know" where the icons reside are probably doing hacky skanky things
  737. to get that information reliably, 'cause the non-scriptable versions of
  738. the Finder are really unfriendly about sharing the knowledge.
  739.  
  740. Grobbins                grobbins@apple.com
  741.  
  742. Usual disclaimers apply.
  743.  
  744.  
  745. +++++++++++++++++++++++++++
  746.  
  747. >From mouse@bu.edu (Matt Mick)
  748. Date: Thu, 28 Jul 1994 17:48:49 -0500
  749. Organization: Boston University
  750.  
  751. In article <311gt1$2g57@blue.weeg.uiowa.edu>, eajohnsn@blue.weeg.uiowa.edu
  752. (Eric Johnson) wrote:
  753.  
  754. > Hope this isn't too obvious, but I lack most reference sources.  I am 
  755. > curious how programs like UnderWare know where on the screen the 
  756. > different icons and folders are kept.  If I wanted to write a program 
  757. > that would move the desktop icons around (or copy the screen and pretend 
  758. > to move them), where do I find their positions?  Any tips or pointers to 
  759. > the correct IM volume would be great.
  760. > Eric Johnson                eajohnsn@blue.weeg.uiowa.edu
  761. > Program in Genetics
  762. > University of Iowa
  763.  
  764. Look at the NIM:Files.  It tells you how to get the h and v pos of the
  765. file.  I think, if I remember correctly, that is for the Icon!
  766.  
  767. --matt
  768.  
  769. ---------------------------
  770.  
  771. >From rweber@helium.Gas.UUG.Arizona.EDU (Roygena R Weber)
  772. Subject: Looking for source code
  773. Date: 26 Jul 1994 22:52:09 GMT
  774. Organization: University of Arizona UNIX Users Group
  775.  
  776.  
  777. Could somebody point me to any ftp sites (besides umich and sumex) that 
  778. contain Macintosh source code? Pascal is preferred, but C is okay, too.
  779.  
  780. Also, is there a FAQ for this group? Where can it be found?
  781.  
  782. Thanks,
  783.  
  784. JACOB WEBER------------------------------------------*
  785.  \   Tucson, Arizona                    Where's       \
  786.   \   rweber@gas.uug.arizona.edu         My            \
  787.    \   CompuServe: 72303,3540             Thing?        \
  788.     *----------------------------------------------------*
  789.  
  790.  
  791. +++++++++++++++++++++++++++
  792.  
  793. >From tg3@u.washington.edu (Thurman Gillespy III)
  794. Date: Wed, 27 Jul 1994 09:21:22 -0800
  795. Organization: Dept of Radiology, Univ of Washington
  796.  
  797. In article <31442p$enm@news.CCIT.Arizona.EDU>,
  798. rweber@helium.Gas.UUG.Arizona.EDU (Roygena R Weber) wrote:
  799.  
  800. > Could somebody point me to any ftp sites (besides umich and sumex) that 
  801. > contain Macintosh source code? Pascal is preferred, but C is okay, too.
  802. > Also, is there a FAQ for this group? Where can it be found?
  803. > Thanks,
  804. > JACOB WEBER------------------------------------------*
  805. >  \   Tucson, Arizona                    Where's       \
  806. >   \   rweber@gas.uug.arizona.edu         My            \
  807. >    \   CompuServe: 72303,3540             Thing?        \
  808. >     *----------------------------------------------------*
  809.  
  810. You should get the Apprentice CD-ROM from Celestin Company. This CD-ROM
  811. is PACKED with source code, demos, and various utilites. Its a bargain
  812. at $35.
  813.  
  814.   Celestin Company
  815.   celestin@pt.olympus.net
  816.   (800) 835-5514 oders
  817.   file://speedway.net/pub/celestin/www/Celestin.html
  818.  
  819. -- 
  820. Thurman Gillespy III, MD         |  tg3@u.washington.edu
  821. Department of Radiology, SB-05   |  (206)543-3320 voice
  822. University of Washington         |  (206)543-6317 fax
  823. Seattle, WA 98195
  824.  
  825. +++++++++++++++++++++++++++
  826.  
  827. >From kenlong@netcom.com (Ken Long)
  828. Date: Wed, 27 Jul 1994 16:02:13 GMT
  829. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  830.  
  831. ftp devtools.symantec.com - has C source.
  832. ftp gatekeeper.dec.com - pub/DEC/Modula-2/m2.tar.Z
  833. ftp ftp.cwi.nl - Pascal
  834. ftp.eb.ele.tue.nl - pub/src/pascal/pasos2*
  835. ftp ftp.uu.net - usenet comp sources
  836. ftp zippy.nimh.nih.gov - image (Pascal - several versions)
  837. ftp nic.switch.ch /software/mac
  838. ftp uniwa.uwa.edu.au - POV
  839. ftp ftp.dartmouth.edu /pub/mac
  840. ftp midway.uchicago.edu /pub/OzTex   
  841. ftp ftpbio.bgsu.edu in pub/mac/alt.sources.mac
  842. ftp ftp.cc.umanitoba.ca /mac/develop
  843. ftp oddjob.uchicago.edu. 
  844. ftp magoo.uwsuper.edu - MacWT .04
  845. ftp csvax.cs.caltech.edu - pub/p2c-1.20.tar.Z.
  846. ftp bigbird.csd.scarolina.edu -  pub/mac - JWWalker
  847. ftp mrcnext.cso.uiuc.edu - pub/mac (old P, B, C, M2, F, A and HC)
  848. ftp prep.ai.mit.edu  pub/gnu/etc/GNU
  849.  
  850. That oughta get you started.
  851.  
  852. Get any ftp site lists that are available and connect and see what they 
  853. have.  The MacFTP List is pretty well known, but there are others.
  854.  
  855. I found one site by reading comp.sources.wanted, and a referral by 
  856. someone there.  That group is mostly non-Mac, but I get site tips from 
  857. messages.  Whenever I read, "So-and-so file is available at ftp.xxx.xxx" 
  858. and it's a site I haven't look on yet, I save that address in NotePad++ 
  859. (which I run in addition to my telecom program) and connect after I get 
  860. out of tin.
  861.  
  862. Always get the site indexes - description files too, if they have them.  
  863. Or start a screen capture as soon as you connect.  I save all the site 
  864. directory lists in a folder on my desktop called "Indexes."
  865.  
  866. Get on some services, too.  AOL has sources you won't find anywhere else, 
  867. and other services may be the same.  You don't have to remain a meber 
  868. for life - just long enough to get all their unique source code, if any.
  869.  
  870. -Ken-
  871.  
  872.  
  873. +++++++++++++++++++++++++++
  874.  
  875. >From Bill Melotti <bill.melotti@rl.ac.uk>
  876. Date: 27 Jul 1994 17:27:59 GMT
  877. Organization: Rutherford Appleton Labs (EPSRC)
  878.  
  879. Looking for source code
  880.  
  881. Try ftp.switch.ch
  882.  
  883. Bill
  884. - -----------------------------------------
  885. Bill Melotti                   Rm2.09, R68,
  886. Electronics Engineer           D-RAL,
  887. System Design Group            Chilton,
  888. Electronics Division           Nr. Didcot,
  889. Rutherford Appleton Lab        OX11 0QX
  890.  
  891. V (0235) 446815, F (0235) 445753
  892. - ----------------------
  893. All these opinions are mine and no one elses
  894.  
  895. +++++++++++++++++++++++++++
  896.  
  897. >From kenlong@netcom.com (Ken Long)
  898. Date: Wed, 27 Jul 1994 19:48:34 GMT
  899. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  900.  
  901. : You should get the Apprentice CD-ROM from Celestin Company. This CD-ROM
  902. : is PACKED with source code, demos, and various utilites. Its a bargain
  903. : at $35.
  904.  
  905. If you're going the CD route, EduCarp (no typo) has source on CD's and 
  906. disks, and MacTech has there source CD available for a couple C notes - 
  907. that's U.S. currency, not music tones.  Yeah, you can have it for a 
  908. song!  Two C notes!
  909.  
  910. Meanwhile, back at reality, there's also the AMUG CD, but theirs and 
  911. EduCarp's contain stuff that's posted.  MacTechs is from their mag.
  912.  
  913. -Ken-
  914.  
  915. +++++++++++++++++++++++++++
  916.  
  917. >From quesnel@sound.music.mcgill.ca (Rene Quesnel)
  918. Date: Wed, 27 Jul 1994 18:21:03 GMT
  919. Organization: Faculty of Music, McGill University
  920.  
  921. Roygena R Weber (rweber@helium.Gas.UUG.Arizona.EDU) wrote:
  922.  
  923. > Could somebody point me to any ftp sites (besides umich and sumex) that 
  924. > contain Macintosh source code? Pascal is preferred, but C is okay, too.
  925.  
  926. Try ftp.apple.com in directory dts/mac/sc. It contains code snippets and
  927. more elaborate examples, some in pascal, a  lot in C and C++. They also
  928. have the source code for the book Macintosh Programming Secrets by Knaster
  929. and Rollin.
  930.  
  931. You can get the csmp FAQ at nada.kth.se in directory
  932. pub/hacks/mac-faq/
  933.  
  934. Rene Quesnel
  935.  
  936. Music Technology and Sound Recording Areas
  937. Faculty of Music, McGill University
  938. Montreal, QC, Canada
  939. e-mail: quesnel@music.mcgill.ca
  940.  
  941.  
  942. +++++++++++++++++++++++++++
  943.  
  944. >From celestin@pt.olympus.net (Paul Celestin)
  945. Date: Thu, 28 Jul 1994 12:54:41 -0700
  946. Organization: Celestin Company
  947.  
  948. In article <31442p$enm@news.CCIT.Arizona.EDU>,
  949. rweber@helium.Gas.UUG.Arizona.EDU (Roygena R Weber) wrote:
  950.  
  951. > Could somebody point me to any ftp sites (besides umich and
  952. > sumex) that  contain Macintosh source code? Pascal is
  953. > preferred, but C is okay, too.
  954.  
  955. Here is a list of a few places I know of:
  956.  
  957. ftp://ftpbio.bgsu.edu/
  958. ftp://daemon.ncsa.uiuc.edu/TCL/
  959. ftp://ftp.luth.se/pub/mac/developer/
  960. ftp://f.ms.uky.edu/pub/mac/sources/
  961. ftp://ftp.ncsa.uiuc.edu/Mac/
  962. ftp://ics.uci.edu/mac/think-c/
  963. ftp://nic.switch.ch/software/mac/src/
  964. ftp://zippy.nimh.nih.gov/pub/nih-image/
  965. ftp://oak.oakland.edu/pub/macintosh/code/
  966. ftp://plains.nodak.edu/pub/mac/pub/programming/src/
  967. ftp://ssyx.ucsc.edu/pub/mac/
  968. ftp://ftp.cc.umanitoba.ca/Mac-Develop/
  969. ftp://ftp.netcom.com/pub/xplain/
  970.  
  971. -- 
  972. celestin@pt.olympus.net              (Paul Celestin, Celestin Company)
  973. Home of Apprentice - the Mac Programmer Source Code & Utilities CD-ROM
  974. finger me for more information about Celestin Company and its products
  975.  
  976. ---------------------------
  977.  
  978. >From smithjim@aol.com (Smith Jim)
  979. Subject: Need C source code for recording sound
  980. Date: 28 Jul 1994 18:12:06 -0400
  981. Organization: America Online, Inc. (1-800-827-6364)
  982.  
  983. I am looking for source code in C that demonstrates how to record sound
  984. with the
  985. microphone input port.  Any ideas?  Thanks.
  986.  
  987. Jim 
  988.  
  989. +++++++++++++++++++++++++++
  990.  
  991. >From mars@netcom.com (Darren Giles)
  992. Date: Fri, 29 Jul 1994 21:40:31 GMT
  993. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  994.  
  995. In article <319afm$sh@search01.news.aol.com>,
  996. Smith Jim <smithjim@aol.com> wrote:
  997. >I am looking for source code in C that demonstrates how to record sound
  998. >with the
  999. >microphone input port.  Any ideas?  Thanks.
  1000. >
  1001. >Jim 
  1002.  
  1003. Here's a section of code which does what I believe you're looking for,
  1004. asynchronously, and writes the sampled sound to a resource.  Enjoy!
  1005.  
  1006. - Darren
  1007.  
  1008. #define    SND_BUFFER_SIZE        (15*11000)
  1009.  
  1010. typedef struct {
  1011.     short                    nbr_channels;
  1012.     Fixed                    sample_rate;
  1013.     short                    sample_size;
  1014.     OSType                    compression_type;
  1015. } snd_in_info;
  1016.  
  1017.  
  1018. ////////////////////////////////////////////////////////////////////////////
  1019. OSErr my_sound_start_recording () {
  1020.     OSErr                    myErr;
  1021.     long                    buff_size;
  1022.  
  1023.  
  1024.     if (!g_snd_dev_refNum)
  1025.         return -1;
  1026.         
  1027.     //    Find out default settings
  1028.     myErr= SPBGetDeviceInfo (g_snd_dev_refNum, siNumberChannels, (char*) &g_snd_info.nbr_channels);
  1029.     TST_MYERR_RTN ("calling SPBGetDeviceInfo")
  1030.     myErr= SPBGetDeviceInfo (g_snd_dev_refNum, siSampleRate, (char*) &g_snd_info.sample_rate);
  1031.     TST_MYERR_RTN ("calling SPBGetDeviceInfo")
  1032.     myErr= SPBGetDeviceInfo (g_snd_dev_refNum, siSampleSize, (char*) &g_snd_info.sample_size);
  1033.     TST_MYERR_RTN ("calling SPBGetDeviceInfo")
  1034.     myErr= SPBGetDeviceInfo (g_snd_dev_refNum, siCompressionType, (char*) &g_snd_info.compression_type);
  1035.     TST_MYERR_RTN ("calling SPBGetDeviceInfo")
  1036.     
  1037.     //    Set to record at 11kHz
  1038.     g_snd_info.sample_rate = rate11khz;
  1039.     myErr= SPBSetDeviceInfo (g_snd_dev_refNum, siSampleRate, (char*) &g_snd_info.sample_rate);
  1040.     TST_MYERR_RTN ("calling SPBSetDeviceInfo")
  1041.     myErr= SPBGetDeviceInfo (g_snd_dev_refNum, siSampleRate, (char*) &g_snd_info.sample_rate);
  1042.     TST_MYERR_RTN ("calling SPBGetDeviceInfo")
  1043.  
  1044.     //    Create new sound handle & setup for SND_RSRC_TYPE rsrc header
  1045.     g_snd_hdl= NewHandle (SND_BUFFER_SIZE);
  1046.     TST_NIL_RTN (g_snd_hdl, "allocating g_snd_hdl handle");
  1047.     myErr= SetupSndHeader (g_snd_hdl, g_snd_info.nbr_channels,
  1048.                 g_snd_info.sample_rate, g_snd_info.sample_size, 
  1049.                 g_snd_info.compression_type, 60, 0, &g_snd_header_len);
  1050.     TST_MYERR_RTN ("calling SetupSndHeader")
  1051.     buff_size= GetHandleSize (g_snd_hdl) - g_snd_header_len;
  1052.     HLockHi (g_snd_hdl);
  1053.     
  1054.     //    Setup & call sound input recording
  1055.     g_snd_PB.inRefNum=            g_snd_dev_refNum;
  1056.     g_snd_PB.count=                buff_size;
  1057.     g_snd_PB.milliseconds=        0;
  1058.     g_snd_PB.bufferLength=        buff_size;
  1059.     g_snd_PB.bufferPtr=            (Ptr) (*g_snd_hdl + g_snd_header_len);
  1060.     g_snd_PB.completionRoutine=    nil;
  1061.     g_snd_PB.interruptRoutine=    nil;
  1062.     g_snd_PB.userLong=            0;
  1063.     g_snd_PB.error=                noErr;
  1064.     g_snd_PB.unused1=            0;
  1065.     myErr= SPBRecord (&g_snd_PB, true);
  1066.     TST_MYERR_RTN ("calling SPBRecord")
  1067.  
  1068.     return noErr;
  1069. }
  1070.  
  1071.  
  1072. ////////////////////////////////////////////////////////////////////////////
  1073. OSErr my_sound_stop_recording () {
  1074.     OSErr                    myErr;
  1075.     long                    lead_size;
  1076.     uchar                    *sample;
  1077.  
  1078.  
  1079.     if (!g_snd_dev_refNum)
  1080.         return -1;
  1081.         
  1082.     //    Make sure we're done reading
  1083.     myErr= SPBStopRecording (g_snd_dev_refNum);
  1084.     TST_MYERR_RTN ("calling SPBStopRecording")
  1085.     
  1086.     //    Update snd info for # bytes actually kept
  1087.     HUnlock (g_snd_hdl);
  1088.     SetHandleSize (g_snd_hdl, g_snd_header_len+g_snd_PB.count);
  1089.     myErr= SetupSndHeader (g_snd_hdl, g_snd_info.nbr_channels,
  1090.                 g_snd_info.sample_rate, g_snd_info.sample_size, 
  1091.                 g_snd_info.compression_type, 60, g_snd_PB.count,
  1092.                 &g_snd_header_len);
  1093.     
  1094.     //    Play it back
  1095.     myErr= SndPlay (nil, g_snd_hdl, 0);
  1096.     TST_MYERR_RTN ("calling SndPlay")
  1097.     
  1098.     return noErr;
  1099. }
  1100.  
  1101.  
  1102. ////////////////////////////////////////////////////////////////////////////
  1103. OSErr my_sound_cancel_recording () {
  1104.     OSErr                    myErr;
  1105.  
  1106.  
  1107.     //    Make sure we're done reading
  1108.     if (g_snd_dev_refNum) {
  1109.         myErr= SPBStopRecording (g_snd_dev_refNum);
  1110.         TST_MYERR_RTN ("calling SPBStopRecording")
  1111.     }
  1112.     
  1113.     if (g_snd_hdl) {
  1114.         ReleaseResource (g_snd_hdl);
  1115.         DisposeHandle (g_snd_hdl);
  1116.         g_snd_hdl= nil;
  1117.     }
  1118.     
  1119.     return noErr;
  1120. }
  1121.  
  1122. +++++++++++++++++++++++++++
  1123.  
  1124. >From kenlong@netcom.com (Ken Long)
  1125. Date: Fri, 29 Jul 1994 20:25:21 GMT
  1126. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1127.  
  1128. On AOL, in the MDV lib., theres an aiff recorder source.  Apple's 
  1129. SoundApp.pas source has some record routine (s), as I recall.
  1130.  
  1131. On AOL, go to the file search (keyword: quickfinder) click the developer 
  1132. box and type in: sound
  1133. and hit return.  That should lead you to some.
  1134.  
  1135. Also, there's source on AOL not listed in the MDV library.  Type in 
  1136. search word: source
  1137. in other directories than MDV, to track it down.
  1138.  
  1139. -Ken-
  1140.  
  1141. +++++++++++++++++++++++++++
  1142.  
  1143. >From Mark Hanrek <hanrek@cts.com>
  1144. Date: Fri, 29 Jul 1994 20:45:36 GMT
  1145. Organization: The Information Workshop
  1146.  
  1147. In article <319afm$sh@search01.news.aol.com> Smith Jim, smithjim@aol.com
  1148. writes:
  1149.  
  1150. >I am looking for source code in C that demonstrates how to record 
  1151. > sound with the microphone input port.  Any ideas?  Thanks.
  1152.  
  1153. Jim,
  1154.  
  1155. There should be at least one source code example in the Development File
  1156. Libraries.
  1157.  
  1158. There are lots and lots of examples, though, on the Developer CD.  If you
  1159. know someone with direct internet access, you can have them download a few
  1160. from ftp.apple.com.
  1161.  
  1162. Hope this helps.
  1163.  
  1164. Mark Hanrek
  1165.  
  1166. ---------------------------
  1167.  
  1168. >From AIKEN <INRA000@MUSICB.MCGILL.CA>
  1169. Subject: OpenPicture with temporary memory?
  1170. Date: Tue, 26 Jul 1994 20:00:30 GMT
  1171. Organization: McGill University
  1172.  
  1173. Hiya,
  1174.  
  1175.     Can anyone think of a reasonably robust way of coercing OpenPicture
  1176. into allocating its picture using temporary memory? I was surprised to
  1177. find no straightforward way of doing this, considering may QD features,
  1178. such as GWorlds, have support for temporary memory.
  1179.  
  1180.     Any help appreciated.
  1181.  
  1182.     Cheers,
  1183.  
  1184.     Mark Aiken
  1185.     inra@musicb.mcgill.ca
  1186.  
  1187.  
  1188. +++++++++++++++++++++++++++
  1189.  
  1190. >From giles@med.cornell.edu (Aaron Giles)
  1191. Date: Wed, 27 Jul 1994 01:56:18 -0400
  1192. Organization: Cornell University Medical College
  1193.  
  1194. In article <26JUL94.16209243.0081@VM1.MCGILL.CA>, AIKEN
  1195. <INRA000@MUSICB.MCGILL.CA> wrote:
  1196.  
  1197. >     Can anyone think of a reasonably robust way of coercing OpenPicture
  1198. > into allocating its picture using temporary memory? I was surprised to
  1199. > find no straightforward way of doing this, considering may QD features,
  1200. > such as GWorlds, have support for temporary memory.
  1201.  
  1202. I don't know how "kosher" this is, but I've done it successfully in a
  1203. shipping app without any apparent problems.  At least, it *seems* simple
  1204. enough. :-)  Here's the gist:
  1205.  
  1206. THz tempZone, oldZone;
  1207. PicHandle thePict;
  1208. OSErr theErr;
  1209.  
  1210. // allocate a handle in temp memory, and retrieve the temporary zone from that
  1211. thePict = (PicHandle)TempNewHandle(4, &theErr);
  1212. if (theErr == noErr && thePict) {
  1213.    tempZone = HandleZone((Handle)thePict);
  1214.    DisposeHandle((Handle)thePict);
  1215.  
  1216.    // open the picture
  1217.    oldZone = GetZone();
  1218.    SetZone(tempZone);
  1219.    thePict = OpenCPicture(&myParams);
  1220.    SetZone(oldZone);
  1221. }
  1222.  
  1223. Aaron
  1224. -- 
  1225. Aaron Giles (giles@med.cornell.edu)
  1226. Power Macintosh Developer, Cornell University Medical College
  1227. JPEGView home page: http://www.med.cornell.edu/jpegview.html
  1228. JPEGView FTP site:   ftp://ftp.med.cornell.edu/pub/aarong/jpegview/
  1229.  
  1230. +++++++++++++++++++++++++++
  1231.  
  1232. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  1233. Date: Wed, 27 Jul 1994 20:28:49 GMT
  1234. Organization: Apple Computer
  1235.  
  1236. In article <26JUL94.16209243.0081@VM1.MCGILL.CA> AIKEN,
  1237. INRA000@MUSICB.MCGILL.CA writes:
  1238. >     Can anyone think of a reasonably robust way of coercing OpenPicture
  1239. > into allocating its picture using temporary memory?
  1240.  
  1241. Aaron Giles' solution of switching to the temp-mem zone is explicitly
  1242. non-kosher; IM warns not to do anything with the parent zone of temp handles.
  1243. I _think_ the only bad thing that will happen, pre-Copland, is that the
  1244. handle will not automatically be disposed when your app quits. If you make
  1245. sure it's always disposed, this shouldn't be a problem. In a modern-OS
  1246. system, though, this might break.
  1247.  
  1248. Other approaches I can think of:
  1249. * Call OpenPicture, then call NewTempHandle and copy the data from
  1250. thePort->picSave handle into the temp handle, then modify thePort->picSave to
  1251. point to the temp handle (and dispose the original one.)
  1252. * Temporarily patch NewHandle during the OpenPicture call, and have the patch
  1253. call NewTempHandle.
  1254.  
  1255.  
  1256. --Jens Alfke
  1257.   jens_alfke@powertalk              Rebel girl, rebel girl,
  1258.             .apple.com              Rebel girl you are the queen of my world
  1259.  
  1260. +++++++++++++++++++++++++++
  1261.  
  1262. >From giles@med.cornell.edu (Aaron Giles)
  1263. Date: Thu, 28 Jul 1994 11:02:18 -0400
  1264. Organization: Cornell University Medical College
  1265.  
  1266. In article <1994Jul27.202849.19507@gallant.apple.com>, Jens Alfke
  1267. <jens_alfke@powertalk.apple.com> wrote:
  1268.  
  1269. > Aaron Giles' solution of switching to the temp-mem zone is explicitly
  1270. > non-kosher; IM warns not to do anything with the parent zone of temp handles.
  1271.  
  1272. Must've missed that warning, but I figured what I was doing was bad
  1273. anyway. :-)  Thanks for the "cleaner" suggestions! (cleaner being a very
  1274. relative term here)
  1275.  
  1276. Aaron
  1277. -- 
  1278. Aaron Giles (giles@med.cornell.edu)
  1279. Power Macintosh Developer, Cornell University Medical College
  1280. JPEGView home page: http://www.med.cornell.edu/jpegview.html
  1281. JPEGView FTP site:   ftp://ftp.med.cornell.edu/pub/aarong/jpegview/
  1282.  
  1283. +++++++++++++++++++++++++++
  1284.  
  1285. >From jmunkki@beta.hut.fi (Juri Munkki)
  1286. Date: 29 Jul 1994 22:54:13 GMT
  1287. Organization: Helsinki University of Technology
  1288.  
  1289. In article <1994Jul27.202849.19507@gallant.apple.com> Jens Alfke <jens_alfke@powertalk.apple.com> writes:
  1290. >Aaron Giles' solution of switching to the temp-mem zone is explicitly
  1291. >non-kosher; IM warns not to do anything with the parent zone of temp handles.
  1292. >I _think_ the only bad thing that will happen, pre-Copland, is that the
  1293. >handle will not automatically be disposed when your app quits. If you make
  1294. >sure it's always disposed, this shouldn't be a problem. In a modern-OS
  1295. >system, though, this might break.
  1296.  
  1297. It probably couldn't be made very compatible with old versions of the
  1298. MultiFinder in any case and some of us (don't look at me though) want
  1299. to support System 6.
  1300.  
  1301. >Other approaches I can think of:
  1302. >* Call OpenPicture, then call NewTempHandle and copy the data from
  1303. >thePort->picSave handle into the temp handle, then modify thePort->picSave to
  1304. >point to the temp handle (and dispose the original one.)
  1305.  
  1306. Sounds dangerous to me, although I'm pretty sure this is safe at least now.
  1307.  
  1308. >* Temporarily patch NewHandle during the OpenPicture call, and have the patch
  1309. >call NewTempHandle.
  1310.  
  1311. Patch???? For something as simple as this? Patches are a necessary evil in
  1312. some cases, but should be avoided when there's a better solution. Besides,
  1313. this will break if QD decides that it needs to load a resource or create
  1314. some other handle when it does the OpenPicture, because the other handle will
  1315. also be temp memory even though it shouldn't.
  1316.  
  1317. In any case, why not just save the QD bottleneck that handles saving pictures.
  1318. You keep a regular handle for the header of the picture and write the data
  1319. into temporary memory. For example code on how this is done, just read the
  1320. IM chapter that has the example on how to write a picture to disk and replace
  1321. the file system calls with temporary memory calls.
  1322.  
  1323. -- 
  1324.   Juri Munkki            There ain't no such thing as a shareware lunch.
  1325.  jmunkki@hut.fi                Windsurfing: Faster than the wind.
  1326.  
  1327. ---------------------------
  1328.  
  1329. >From cabo@mi.aau.dk (Christian Orellana)
  1330. Subject: QuickTime 2.0 and MIDI
  1331. Date: Mon, 25 Jul 1994 21:34:49 GMT
  1332. Organization: aau
  1333.  
  1334.  
  1335. Hi!
  1336. I understand that some music extension is needed to make QuickTime 2.0 interact
  1337. with MIDI. Does anybody know the details of this product? like:
  1338.  
  1339. a) Is this an existing product?
  1340. b) Where do I get it?
  1341. c) How does it work; does it cooperate with the midi manager? 
  1342. d) Does it support general midi pacthes only, or can one add custom sounds?
  1343. e) Is it implemented as a component?
  1344.  
  1345. Best regards -
  1346. Christian A.Borlund Orellana
  1347. Institute of Physics and Astronomy Aarhus University.
  1348. ______________________________________________________
  1349. Internet e-mail:        muscabo@dfi.aau.dk
  1350. voice:                  +45-86102798
  1351. mail:                   Dr.Margrethesvej 11,3.th.
  1352.                         8200 Aarhus N, DENMARK.
  1353. ______________________________________________________
  1354.  
  1355.  
  1356. +++++++++++++++++++++++++++
  1357.  
  1358. >From rmah@panix.com (Robert Mah)
  1359. Date: 26 Jul 1994 20:51:28 GMT
  1360. Organization: One Step Beyond
  1361.  
  1362. cabo@mi.aau.dk (Christian Orellana) wrote:
  1363.  
  1364. ) I understand that some music extension is needed to make QuickTime 2.0
  1365. ) interact with MIDI. Does anybody know the details of this product? like:
  1366. ) a) Is this an existing product?
  1367.  
  1368. Has been announced.  Was on the latest developer CD.  I'm not sure if 
  1369. it's available to the general public or shipping with new machines yet.
  1370.  
  1371. ) b) Where do I get it?
  1372.  
  1373. Apple.  You can get the QT developer's kit from APDA.
  1374.  
  1375. ) c) How does it work; does it cooperate with the midi manager? 
  1376.  
  1377. I haven't looked at it closely, but from the general description, I think
  1378. it implements the General MIDI spec (or parts of it).  That is, it contains
  1379. samples for a variety of instruments at various pitches and probably allows
  1380. you to play them by note.
  1381.  
  1382. ) d) Does it support general midi pacthes only, or can one add custom sounds?
  1383. ) e) Is it implemented as a component?
  1384.  
  1385. Don't know.  Anyone looked at the extension on the CD closer yet?
  1386.  
  1387. Cheers,
  1388. Rob
  1389. _____________________________________________________________________
  1390. Robert S. Mah           Software Development          +1.212.947.6507
  1391. One Step Beyond        and Network Consulting          rmah@panix.com
  1392.  
  1393. +++++++++++++++++++++++++++
  1394.  
  1395. >From quesnel@sound.music.mcgill.ca (Rene Quesnel)
  1396. Date: Wed, 27 Jul 1994 11:44:47 GMT
  1397. Organization: Faculty of Music, McGill University
  1398.  
  1399. Christian Orellana (cabo@mi.aau.dk) wrote:
  1400.  
  1401. > Hi!
  1402. > I understand that some music extension is needed to make QuickTime 2.0 interact
  1403. > with MIDI. Does anybody know the details of this product? like:
  1404.  
  1405. > a) Is this an existing product?
  1406. > b) Where do I get it?
  1407. > c) How does it work; does it cooperate with the midi manager? 
  1408. > d) Does it support general midi pacthes only, or can one add custom sounds?
  1409. > e) Is it implemented as a component?
  1410.  
  1411. There is a short document "QuickTime 2.0 Information" available at
  1412. ftp.support.apple.com in directory 
  1413. /pub/Apple SW Updates /Macintosh/Supplemental System Software/.
  1414. It doesn't say much but it's a start.
  1415.  
  1416. Rene Quesnel
  1417.  
  1418. Music Technology and Sound Recording Areas
  1419. Faculty of Music, McGill University
  1420. Montreal, QC, Canada
  1421. e-mail: quesnel@music.mcgill.ca
  1422.  
  1423.  
  1424. +++++++++++++++++++++++++++
  1425.  
  1426. >From andreas@sctc.com (Glenn Andreas)
  1427. Date: Wed, 27 Jul 1994 15:37:11 GMT
  1428. Organization: SCTC
  1429.  
  1430. rmah@panix.com (Robert Mah) writes:
  1431.  
  1432. >cabo@mi.aau.dk (Christian Orellana) wrote:
  1433.  
  1434. >) I understand that some music extension is needed to make QuickTime 2.0
  1435. >) interact with MIDI. Does anybody know the details of this product? like:
  1436. >) 
  1437.  
  1438. >) c) How does it work; does it cooperate with the midi manager? 
  1439.  
  1440. >I haven't looked at it closely, but from the general description, I think
  1441. >it implements the General MIDI spec (or parts of it).  That is, it contains
  1442. >samples for a variety of instruments at various pitches and probably allows
  1443. >you to play them by note.
  1444.  
  1445. >) d) Does it support general midi pacthes only, or can one add custom sounds?
  1446. >) e) Is it implemented as a component?
  1447.  
  1448. >Don't know.  Anyone looked at the extension on the CD closer yet?
  1449.  
  1450. Actually, the "Music Component Architecture" (or something like that) isn't
  1451. MIDI.  However, with MoviePlayer 2.0 you can convert MIDI files to QuickTime
  1452. movies that just contain the (music) sound track.  Also, if you have a MIDI
  1453. output device, you can have QuickTime convert the music to play on the MIDI
  1454. device.  Don't know if there are any simple, direct ways to input from a
  1455. MIDI device, since I don't own one.
  1456.  
  1457. There are actually three different components - the Music Component (a low
  1458. level component that you aren't suppose to talk to), the Note Allocator, and
  1459. the Tune Player.  You basically set up a bunch of commands, similar to MIDI
  1460. (there are note commands, rest commands, knob commands, general commands,
  1461. control commands, etc...), and send them to the Tune Player.
  1462.  
  1463. The Music Component (there are actually two - built in synthesizer, and
  1464. "general MIDI device") is the thing that actually either plays them via
  1465. the sound manager, or converts them to MIDI.  The note allocator sits between
  1466. the two and figures out how to manage the music component based on the needs
  1467. of the tune player.
  1468.  
  1469. All in all, once you've figured it out, it works quite well, especially for
  1470. things such as adding background music to games (for example).  BTW, I've
  1471. recently written an article that will hopefully appear in an upcoming
  1472. MacTech explaining the basic format of music commands and the tune player.
  1473.  
  1474. Glenn Andreas
  1475.  
  1476.  
  1477. +++++++++++++++++++++++++++
  1478.  
  1479. >From rmah@panix.com (Robert Mah)
  1480. Date: 27 Jul 1994 20:47:57 GMT
  1481. Organization: One Step Beyond
  1482.  
  1483. andreas@sctc.com (Glenn Andreas) wrote:
  1484.  
  1485. ) Actually, the "Music Component Architecture" (or something like that)
  1486. ) isn't MIDI.  However, with MoviePlayer 2.0 you can convert MIDI files
  1487. ) to QuickTime movies that just contain the (music) sound track.  Also,
  1488. ) if you have a MIDI output device, you can have QuickTime convert the
  1489. ) music to play on the MIDI device.  Don't know if there are any simple,
  1490. ) [...]
  1491.  
  1492. Sounds cool, though it's too bad Apple didn't try harder to conform with
  1493. the General MIDI standard.  Oh well.
  1494.  
  1495. Do you know where I could pick up the docs on this stuff?  I searched
  1496. the latest developer CD with QT 2.0 on it, but couldn't find any info.
  1497. Some special, new Apple multimedia FTP site perchance?
  1498.  
  1499. Cheers,
  1500. Rob
  1501. _____________________________________________________________________
  1502. Robert S. Mah           Software Development          +1.212.947.6507
  1503. One Step Beyond        and Network Consulting          rmah@panix.com
  1504.  
  1505. +++++++++++++++++++++++++++
  1506.  
  1507. >From aclaasse@nyx.cs.du.edu (Arne Claassen)
  1508. Date: 27 Jul 1994 22:52:49 -0600
  1509. Organization: University of Denver, Dept. of Math & Comp. Sci.
  1510.  
  1511. In article <rmah-2707940250560001@rmah.dialup.access.net>,
  1512. Robert Mah <rmah@panix.com> wrote:
  1513. >Sounds cool, though it's too bad Apple didn't try harder to conform with
  1514. >the General MIDI standard.  Oh well.
  1515.  
  1516. In what respect? The story i got was that Roland liscensen them their GS
  1517. seris sounds for Quicktime 2.0. Only a subset of the entire GM set is supposed
  1518. to be in QT 2.0, but the rest can be added by developers if needed.
  1519. The internal format is not a standard midifile, but if a MIDI device is 
  1520. present (i'd have to assume that QT 2.0 works with MIDI Manager) it will
  1521. play through to the midi device. At least that's what the propaganda claimed.
  1522.  
  1523. Arne F. Claassen     claassen@ebs330.eb.uah.edu
  1524.  
  1525.  
  1526. +++++++++++++++++++++++++++
  1527.  
  1528. >From al@crucible.powertools.com (Al Evans)
  1529. Date: 29 Jul 94 14:35:21 GMT
  1530. Organization: PowerTools, Austin, Texas
  1531.  
  1532. In article <317dj1$b0h@nyx.cs.du.edu> aclaasse@nyx.cs.du.edu (Arne Claassen) writes:
  1533.  
  1534. >In article <rmah-2707940250560001@rmah.dialup.access.net>,
  1535. >Robert Mah <rmah@panix.com> wrote:
  1536. >>Sounds cool, though it's too bad Apple didn't try harder to conform with
  1537. >>the General MIDI standard.  Oh well.
  1538.  
  1539. >In what respect? The story i got was that Roland liscensen them their GS
  1540. >seris sounds for Quicktime 2.0. Only a subset of the entire GM set is supposed
  1541. >to be in QT 2.0, but the rest can be added by developers if needed.
  1542.  
  1543. If the QuickTime 2.0 music-playing routines "conformed with the General
  1544. MIDi standard," you would be able to play to a note-allocator 
  1545. NoteChannel just like you would to a real MIDI device. This is not
  1546. feasible beyond a certain elementary level (i.e., note-on, note-off,
  1547. and perhaps controller events). A simple example: using the built-in
  1548. synthesizer, a program change cannot be implemented in real time, since
  1549. it requires loading a new sound sample from the disk (which is slow)
  1550. and you can't do it at interrupt time.
  1551.  
  1552. Actually, according to *one* Apple tech support person, you're not 
  1553. allowed to make ANY note allocator calls at interrupt time. I dismissed
  1554. this as improbable, since the note allocator has no built-in timing
  1555. facilities (as does the Midi Manager, for example). So far, I have
  1556. had no trouble calling NAPlayNote(), at least, from an interrupt 
  1557. handler -- I was told by another Apple tech support person that this
  1558. was legal.
  1559.                     --Al Evans--
  1560. -- 
  1561. Al Evans        |   Graphic Elements: A new standard for 
  1562. ________________________|__ high-performance interactive Macintosh graphics.
  1563. al@crucible.powertools.com |  Available from mac.archive.umich.edu
  1564. - -------------------------| /mac/development/libraries/graphicelements2.sit.hqx
  1565.  
  1566. ---------------------------
  1567.  
  1568. >From rcostale@nmsu.edu (Raphael J. Costales)
  1569. Subject: Tab Patch for TextEdit
  1570. Date: 29 Jul 1994 05:22:07 GMT
  1571. Organization: New Mexico State University, Las Cruces, NM
  1572.  
  1573. /***************************************************************************
  1574.  
  1575.     tab_patch.c
  1576.  
  1577.     A while back, jesjones@stein.u.washington.edu posted some code written
  1578. in Modula-2 for three patches to TextEdit.  These patches enable TextEdit to
  1579. display tab characters as a run of spaces.  The three routines are:
  1580.  
  1581.     1.  DrawText
  1582.     2.  TextWidth
  1583.     3.  Pixel2Char (System 6)
  1584.         NPixel2Char (System 7)
  1585.  
  1586.     I rewritten the code in C in Think C ver. 4 using System 6 and tested it
  1587. on a Mac Plus - eight years old, but it still works fine!  I just wrote the
  1588. Pixel2Char, but NPixel2Char would be handled the same way.  The three patches
  1589. work the same way.  They expand tab characters into spaces then call the
  1590. original routine.
  1591.  
  1592.     Note, Pixel2Char & NPixel2Char are not real traps.  They use a generic
  1593. trap, ScriptUtil, after pushing a selector on the stack (see IM V).  Because
  1594. ScriptUtil takes a varying number of arguments, some assembly is required -
  1595. excuse the pun.
  1596.  
  1597.     Fell free to send any comments or suggestions other than buy a new Mac!
  1598.  
  1599.     rcostale@nmsu.edu
  1600.  
  1601. ***************************************************************************/
  1602.  
  1603. #define TABLEN      4           /* Tab length */
  1604. #define MAXSIZE     256         /* Size of Buffer.  Any text expanded beyond
  1605.                                  * the size of the buffer won't be displayed
  1606.                                  */
  1607.  
  1608. extern WindowPtr myWindow;      /* Of course, these would be your working */
  1609. extern TEHandle TEH;            /* Window pointer and TextEdit handle */
  1610.  
  1611. static pascal void  DoTrap();
  1612.  
  1613. pascal void newDrawText(char *, short, short);
  1614. pascal int  newTextWidth(char *, short, short);
  1615. pascal int  newPixel2Char(char *, short, short, short, Boolean *, long);
  1616.  
  1617. ProcPtr     oldDrawText, oldTextWidth, oldPixel2Char;
  1618.  
  1619. TabsOn()    /* Install patches */
  1620. {
  1621.     /* The first two patches are straight forward */
  1622.  
  1623.     oldDrawText = (ProcPtr) NGetTrapAddress(0xA885, ToolTrap);
  1624.     oldTextWidth = (ProcPtr) NGetTrapAddress(0xA886, ToolTrap);
  1625.  
  1626.     NSetTrapAddress((long) newDrawText, 0xA885, ToolTrap);
  1627.     NSetTrapAddress((long) newTextWidth, 0xA886, ToolTrap);
  1628.  
  1629.     /* The Pixel2Char uses the generic trap ScriptUtil.  We will patch in
  1630.      * an assembly routine that test the selector
  1631.      */
  1632.  
  1633.     oldPixel2Char = (ProcPtr) NGetTrapAddress(0xA8B5, ToolTrap);
  1634.     NSetTrapAddress((long) DoTrap, 0xA8B5, ToolTrap);
  1635. }
  1636.  
  1637. TabsOff()   /* Remove the patches when you're application finishes! */
  1638. {
  1639.     NSetTrapAddress((long) oldDrawText, 0xA885, ToolTrap);
  1640.     NSetTrapAddress((long) oldTextWidth, 0xA886, ToolTrap);
  1641.     NSetTrapAddress((long) oldPixel2Char, 0xA8B5, ToolTrap);
  1642. }
  1643.  
  1644. /* The assembly routine to check selector */
  1645. static pascal void DoTrap()
  1646. {
  1647.     long    selector = 0x820E0014;  /* or 0x8222002 for NPixel2Char */
  1648.  
  1649.     asm {
  1650.         move.l  selector, d0
  1651.         unlk    a6
  1652.         cmp.l   4(sp), d0           /* Is it the Pixel2Char selector? */
  1653.         bne.s   @old                /* No, do old oldPixel2Char */
  1654.         jmp     newPixel2Char       /* Yes, do patch */
  1655. @old
  1656.         move.l  oldPixel2Char, a0
  1657.         jmp     (a0)
  1658.     }
  1659. }
  1660.  
  1661. pascal void newDrawText(char textPtr[], short first, short count)
  1662. {
  1663.     char    buffPtr[MAXSIZE] = {0};
  1664.     int     buffCount;
  1665.  
  1666.     /* if were using my window then expand the text into the buffer and
  1667.      * call the original routine using the buffer.
  1668.      */
  1669.  
  1670.     if (FrontWindow() == myWindow) {
  1671.         buffCount = tab2spaces(textPtr + first, buffPtr, count);
  1672.         CallPascal(buffPtr, 0, buffCount, oldDrawText);
  1673.     }
  1674.     else
  1675.         CallPascal(textPtr, first, count, oldDrawText);
  1676. }
  1677.  
  1678. pascal int newTextWidth(char textPtr[], short first, short count)
  1679. {
  1680.     char    buffPtr[MAXSIZE] = {0};
  1681.     int     buffCount;
  1682.  
  1683.     /* same idea here */
  1684.  
  1685.     if (FrontWindow() == myWindow) {
  1686.         buffCount = tab2spaces(textPtr + first, buffPtr, count);
  1687.         return CallPascalW(buffPtr, 0, buffCount, oldTextWidth);
  1688.     }
  1689.     else
  1690.         return CallPascalW(textPtr, first, count, oldTextWidth);
  1691. }
  1692.  
  1693. /* This function converts tabs to spaces and places the text in a buffer.
  1694.  * It also returns the size of the buffer.
  1695.  */
  1696. int tab2spaces(char textPtr[], char buffPtr[], short count)
  1697. {
  1698.     char    chr;
  1699.     int     i, j, buffCount, spc;
  1700.  
  1701.     i = j = spc = 0;
  1702.     buffCount = offset(textPtr);
  1703.     for (i = 0; i < count; i++) {
  1704.         switch (chr = textPtr[i]) {
  1705.         case '\t':
  1706.             spc = TABLEN - (buffCount % TABLEN);
  1707.             while (spc--) {
  1708.                 buffPtr[j++] = ' ';
  1709.                 buffCount++;
  1710.             }
  1711.             break;
  1712.         case '\r':
  1713.             buffCount = 0;
  1714.         default:
  1715.             buffPtr[j++] = chr;
  1716.             buffCount++;
  1717.         }
  1718.     }
  1719.     return j;
  1720. }
  1721.  
  1722. /* This function finds the offset from the start of a line. */
  1723. int offset(char textPtr[])
  1724. {
  1725.     char   *linePtr, *charPtr;
  1726.     int     i = 0;
  1727.  
  1728.     linePtr = textPtr;
  1729.  
  1730.     /* find start of line */
  1731.  
  1732.     while ((linePtr > (*(**TEH).hText)) && (*linePtr != '\r'))
  1733.         linePtr--;
  1734.  
  1735.     /* find offset */
  1736.  
  1737.     for (charPtr = linePtr; charPtr < textPtr; charPtr++)
  1738.         switch (*charPtr) {
  1739.         case '\t':
  1740.             i = i + TABLEN - (i % TABLEN);
  1741.             break;
  1742.         case '\r':
  1743.             i = 0;
  1744.             break;
  1745.         default:
  1746.             i++;
  1747.         }
  1748.     return i;
  1749. }
  1750.  
  1751. /* Note, the selector is not an actual parameter. The selector is push on to
  1752.  * the stack before issuing the ScriptUtil trap.  Since the Pascal calling
  1753.  * convention pushes parametes from left-to-right, the selector is right above
  1754.  * the return address.  Use NPixel2Char declaration if you're using System 7.
  1755.  */
  1756. pascal int newPixel2Char(char textPtr[], short count, short slop, short width,
  1757.                          Boolean *leadingEdge, long selector)
  1758. {
  1759.     char    buffPtr[MAXSIZE] = {0};
  1760.     int     buffCount, pos;
  1761.  
  1762.     /* Again, we expand the text into a buffer and call the original trap */
  1763.  
  1764.     if (FrontWindow() == myWindow) {
  1765.         buffCount = tab2spaces(textPtr, buffPtr, count);
  1766.         pos = CallPascalW(buffPtr, buffCount, slop, width, &leadingEdge,
  1767.                           selector, oldPixel2Char);
  1768.         return charPos(textPtr, pos);
  1769.     }
  1770.     else
  1771.         return CallPascalW(textPtr, count, slop, width, &leadingEdge,
  1772.                            selector, oldPixel2Char);
  1773. }
  1774.  
  1775. /* returns the character position in the actual text corresponding to
  1776.  * position in the buffer.
  1777.  */
  1778. int charPos(char textPtr[], int pos)
  1779. {
  1780.     char   *linePtr;
  1781.     int i = 0, j =0 ;
  1782.  
  1783.     linePtr = textPtr;
  1784.     while ((linePtr > (*(**TEH).hText)) && (*linePtr != '\r'))
  1785.         linePtr--;
  1786.  
  1787.     while (i < pos) {
  1788.         switch (*linePtr) {
  1789.         case '\t':
  1790.             i = i + TABLEN - (i % TABLEN);
  1791.             j++;
  1792.             break;
  1793.         case '\r':
  1794.             i = j = 0;
  1795.             break;
  1796.         default:
  1797.             i++; j++;
  1798.         }
  1799.         linePtr++;
  1800.     }
  1801.     return j;
  1802. }
  1803.  
  1804. -- 
  1805. +------+
  1806. |      | Raphael J.S. Costales
  1807. | NMSU | rcostale@nmsu.edu
  1808. |  *___| New Mexico State University
  1809.  
  1810. ---------------------------
  1811.  
  1812. >From cshotton@oac.hsc.uth.tmc.edu (Chuck Shotton)
  1813. Subject: [Q] Increasing stack size?
  1814. Date: Fri, 29 Jul 1994 11:27:07 -0600
  1815. Organization: Academic Computing, UT-Houston
  1816.  
  1817. Can anyone think of a reason why a program that runs fine on most every Mac
  1818. model ends up with a stack (not heap) that runs out of space on a SE or
  1819. Plus? Is there something different that Think C (or CodeWarrior, for that
  1820. matter) must do on a 68K Mac that would cause it to eat significantly more
  1821. stack space? FWIW the app is MacHTTP, so it's playing with MacTCP,
  1822. AppleScript (if available), and AppleTalk (if required by MacTCP).
  1823.  
  1824. Stack space and heap space come out of the same chunk of memory allocated
  1825. to the application, correct? Is it possible that one of the aforementioned
  1826. software elements may eat up a bunch of memory on a Plus or SE? The
  1827. confusing thing is that frequent checks of available RAM show nothing amiss
  1828. while the program is running, yet it ends up with a corrupted stack
  1829. (because it runs out of space?)
  1830.  
  1831. --_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_\_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  1832. Chuck Shotton                             \ 
  1833. Assistant Director, Academic Computing     \   "Are we there yet?"
  1834. U. of Texas Health Science Center Houston   \ 
  1835. cshotton@oac.hsc.uth.tmc.edu  (713) 794-5650 \ 
  1836. _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\-_-_-_-_-_-_-_-_-_-_-_-_-
  1837.  
  1838. +++++++++++++++++++++++++++
  1839.  
  1840. >From larson@oahu.cs.ucla.edu (Christopher Larson)
  1841. Date: Fri, 29 Jul 94 18:36:15 GMT
  1842. Organization: UCLA, Computer Science Department
  1843.  
  1844. In article <cshotton-290794112707@oac2.hsc.uth.tmc.edu> cshotton@oac.hsc.uth.tmc.edu (Chuck Shotton) writes:
  1845. >Can anyone think of a reason why a program that runs fine on most every Mac
  1846. >model ends up with a stack (not heap) that runs out of space on a SE or
  1847. >Plus?
  1848.  
  1849. Sure. Neither of those machines has Color Quickdraw. On machines without CQD,
  1850. the default stack size is (I believe) 8K, but on a machine with CQD (as most
  1851. Macs out there today are) the default stack size is 32K. Your program must
  1852. use stack space larger than 8K and smaller than 32K -- hence it works on
  1853. CQD machines but not the old ones.
  1854.  
  1855. >Stack space and heap space come out of the same chunk of memory allocated
  1856. >to the application, correct?
  1857.  
  1858. Yup.
  1859.  
  1860. >Is it possible that one of the aforementioned
  1861. >software elements may eat up a bunch of memory on a Plus or SE?
  1862.  
  1863. I doubt they eat any _more_ on a Plus or SE than on other machines; whether
  1864. or not they eat up a 'bunch' is left as an exercise for the reader ;-).
  1865.  
  1866. >The
  1867. >confusing thing is that frequent checks of available RAM show nothing amiss
  1868. >while the program is running, yet it ends up with a corrupted stack
  1869. >(because it runs out of space?)
  1870.  
  1871. Are you checking the amount of free stack space during runtime (other than
  1872. by watching the stack sniffer inititate a system error)? During development,
  1873. you should try to max out the stack usage and then call StackSpace() to
  1874. determine your stack usage. If this usage is larger than the smallest default
  1875. stack size, you should expand the stack to accomidate for this difference.
  1876. (E.g. if you find that your program uses 20K of stack space, you should
  1877. expand the stack by at least 12K (perhaps a little more for cushioning) in
  1878. the initialization phase of your program.)
  1879.  
  1880. Techniques for expanding the stack and the details of the StackSpace() call
  1881. can be found in Inside Macintosh: Memory.
  1882.  
  1883. --Chris
  1884. _______________________________________________________________________________
  1885. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  1886. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  1887. Death to the Trojans! Go Bruins!
  1888.  
  1889. (Insert disclaimer here)
  1890. Internet: larson@kingston.cs.ucla.edu
  1891.  
  1892. ---------------------------
  1893.  
  1894. End of C.S.M.P. Digest
  1895. **********************
  1896.  
  1897.  
  1898.  
  1899.